import pandas as pd

# 定义函数：统计职业等级人数及占比，并支持灵活配置不同职业等级的阈值
def calculate_profession_level_distribution(file_path, level_limits=None):
    # 默认阈值配置（如果未提供）
    default_level_limits = {'1': 10, '2': 20, '3': 30}  # 示例默认值
    level_limits = level_limits if level_limits is not None else default_level_limits

    # 读取表格数据（假设为XLSX文件）
    try:
        data = pd.read_excel(file_path)
    except Exception as e:
        return f"无法读取文件，请检查文件路径或格式。错误信息：{e}"

    # 确保表头包含“职业等级”字段
    if '职业等级' not in data.columns:
        return "请确保表格中包含'职业等级'字段。"

    # 将职业等级列转换为字符串类型，并处理缺失值
    data['职业等级'] = data['职业等级'].fillna('').astype(str)

    # 合并特定等级：将 '2+' 归类为 '2'，'3+' 归类为 '3'，依此类推
    def map_level(level):
        if level.endswith('+'):
            return level[:-1]  # 去掉 '+' 符号
        return level

    data['职业等级'] = data['职业等级'].apply(map_level)

    # 统计每个职业等级的人数
    level_counts = data['职业等级'].value_counts().sort_index()

    # 计算总人数
    total_count = len(data)

    if total_count == 0:
        return "数据为空，无法计算职业等级分布。"

    # 计算占比并保留一位小数
    level_percentages = (level_counts / total_count * 100).round(1)  # 保留一位小数

    # 调整占比总和为100%
    if not level_percentages.empty:
        total_percentage = level_percentages.sum()
        difference = 100 - total_percentage
        # 将差值加到最后一个职业等级的占比上，并确保保留一位小数
        level_percentages.iloc[-1] = round(level_percentages.iloc[-1] + difference, 1)

    # 构建结果表格
    result = pd.DataFrame({
        '职业等级': level_percentages.index,
        '人数': level_counts.values,
        '占比(%)': level_percentages.values
    })

    # 添加警告列，检查每个职业等级是否超过设定的阈值
    warnings = []
    for level in result['职业等级']:
        limit = level_limits.get(level, float('inf'))  # 如果没有配置阈值，默认不限制
        percentage = level_percentages.get(level, 0)
        if percentage > limit:
            warning_message = f"职业等级{level}不可超过{limit}%，当前占比{percentage:.1f}%"  # 保留一位小数
        else:
            warning_message = ""
        warnings.append(warning_message)

    result['警告'] = warnings

    return result


# 示例调用
if __name__ == "__main__":
    file_path = 'level.xlsx'  # 替换为您实际的文件路径
    # 配置不同职业等级的阈值
    level_limits = {
        '1': 10,  # 职业等级1的最大占比为10%
        '2': 10,
        '3': 10,
        '4': 10,
        '5': 10,
        '6': 10,
        '7': 10,
        '8': 10
    }
    result = calculate_profession_level_distribution(file_path, level_limits)
    if isinstance(result, str):  # 如果返回的是错误信息
        print(result)
    else:
        print(result)